home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / MiscKit1.7.1 / MiscKit / Palettes / MiscClockPalette / MiscClockView.subproj / MiscClockView.m < prev    next >
Encoding:
Text File  |  1995-07-06  |  12.9 KB  |  642 lines

  1. //
  2. //    MiscClockView.m -- a simple view class for displaying date/time
  3. //        Written by Scott Anguish Copyright (c) 1993 by Scott Anguish.
  4. //                Version 1.2.  All rights reserved.
  5. //
  6. //        This notice may not be removed from this source code.
  7. //
  8. //    This object is included in the MiscKit by permission from the author
  9. //    and its use is governed by the MiscKit license, found in the file
  10. //    "LICENSE.rtf" in the MiscKit distribution.  Please refer to that file
  11. //    for a list of all applicable permissions and restrictions.
  12. //    
  13.  
  14. #import <sys/time.h>    
  15.  
  16. #import "MiscClockView.h"
  17.  
  18. @interface MiscClockView(private)
  19. - _setUp;
  20. @end
  21.  
  22. @implementation MiscClockView
  23.  
  24.  
  25. #define Misc_BuildImage(a, b, c, d, e)     NXSetRect(theRect, (b), (c), (d), (e)); \
  26.     a = [[NXImage alloc] initFromImage:theImage rect:theRect];
  27.  
  28.  
  29. + initialize
  30. {
  31.         [MiscClockView setVersion:3];
  32.     return self;
  33. }
  34.  
  35.  
  36. - _setUp
  37. {
  38. char           buf[MAXPATHLEN + 1] = "";
  39. NXRect         rectStorage, *theRect = &rectStorage;
  40. NXSize         oneSize, twoSize;
  41.  
  42.     if (theImage) return self; // don't want to leak!
  43.  
  44.     [[NXBundle bundleForClass:[self class]] getPath:buf forResource:"MiscClockStuff" ofType:"tiff"];
  45.     theImage = [[NXImage alloc] initFromFile:buf];
  46.  
  47.  
  48.  /* Yes this is ugly, and there is alot of extra junk in here, but to a
  49.   * large degree at this point I didn't know where else to store these
  50.   * co-ordinates where I wouldn't loose them! */
  51.  
  52.     Misc_BuildImage (imageA, 65.0, 0.0, 9.0, 11.0);
  53.     Misc_BuildImage (imageP, 74.0, 0.0, 9.0, 11.0);
  54.     Misc_BuildImage (DigitalNumbers[1], 89.0, 0.0, 4.0, 11.0);
  55.     Misc_BuildImage (DigitalNumbers[2], 93.0, 0.0, 9.0, 11.0);
  56.     Misc_BuildImage (DigitalNumbers[3], 104.0, 0.0, 8.0, 11.0);
  57.     Misc_BuildImage (DigitalNumbers[4], 112.0, 0.0, 9.0, 11.0);
  58.     Misc_BuildImage (DigitalNumbers[5], 121.0, 0.0, 9.0, 11.0);
  59.     Misc_BuildImage (DigitalNumbers[6], 130.0, 0.0, 9.0, 11.0);
  60.     Misc_BuildImage (DigitalNumbers[7], 140.0, 0.0, 8.0, 11.0);
  61.     Misc_BuildImage (DigitalNumbers[8], 148.0, 0.0, 9.0, 11.0);
  62.     Misc_BuildImage (DigitalNumbers[9], 157.0, 0.0, 9.0, 11.0);
  63.     Misc_BuildImage (DigitalNumbers[0], 166.0, 0.0, 9.0, 11.0);
  64.     Misc_BuildImage (imageColon, 175.0, 0.0, 3.0, 11.0);
  65.     Misc_BuildImage (imageAM, 179.0, 0.0, 12.0, 6.0);
  66.     Misc_BuildImage (imagePM, 192.0, 0.0, 11.0, 6.0);
  67.  
  68.     Misc_BuildImage (DayNames[1], 0, 65, 19, 5);
  69.     Misc_BuildImage (DayNames[2], 0, 59, 19, 5);
  70.     Misc_BuildImage (DayNames[3], 0, 53, 19, 5);
  71.     Misc_BuildImage (DayNames[4], 0, 47, 19, 5);
  72.     Misc_BuildImage (DayNames[5], 0, 41, 19, 5);
  73.     Misc_BuildImage (DayNames[6], 0, 35, 19, 5);
  74.     Misc_BuildImage (DayNames[0], 0, 29, 19, 5);
  75.  
  76.     Misc_BuildImage (MonthNames[0], 40, 66, 22, 5);
  77.     Misc_BuildImage (MonthNames[1], 40, 60, 22, 5);
  78.     Misc_BuildImage (MonthNames[2], 40, 54, 22, 5);
  79.     Misc_BuildImage (MonthNames[3], 40, 48, 22, 5);
  80.     Misc_BuildImage (MonthNames[4], 40, 42, 22, 5);
  81.     Misc_BuildImage (MonthNames[5], 40, 36, 22, 5);
  82.     Misc_BuildImage (MonthNames[6], 40, 30, 22, 5);
  83.     Misc_BuildImage (MonthNames[7], 40, 24, 22, 5);
  84.     Misc_BuildImage (MonthNames[8], 40, 18, 22, 5);
  85.     Misc_BuildImage (MonthNames[9], 40, 12, 22, 5);
  86.     Misc_BuildImage (MonthNames[10], 40, 6, 22, 5);
  87.     Misc_BuildImage (MonthNames[11], 40, 0, 22, 5);
  88.  
  89.     Misc_BuildImage (DateNumbers[0], 172.0, 14.0, 10.0, 17.0);
  90.     Misc_BuildImage (DateNumbers[1], 65.0, 14.0, 8.0, 17.0);
  91.     Misc_BuildImage (DateNumbers[2], 76.0, 14.0, 10.0, 17.0);
  92.     Misc_BuildImage (DateNumbers[3], 88.0, 14.0, 9.0, 17.0);
  93.     Misc_BuildImage (DateNumbers[4], 100.0, 14.0, 10.0, 17.0);
  94.     Misc_BuildImage (DateNumbers[5], 112.0, 14.0, 10.0, 17.0);
  95.     Misc_BuildImage (DateNumbers[6], 124.0, 14.0, 10.0, 17.0);
  96.     Misc_BuildImage (DateNumbers[7], 136.0, 14.0, 10.0, 17.0);
  97.     Misc_BuildImage (DateNumbers[8], 148.0, 14.0, 10.0, 17.0);
  98.     Misc_BuildImage (DateNumbers[9], 160.0, 14.0, 10.0, 17.0);
  99.  
  100.     Misc_BuildImage (YearNumbers[0], 12.0, 8.0, 6.0, 5.0);
  101.     Misc_BuildImage (YearNumbers[1], 0.0, 20.0, 2.0, 5.0);
  102.     Misc_BuildImage (YearNumbers[2], 2.0, 20.0, 5.0, 5.0);
  103.     Misc_BuildImage (YearNumbers[3], 7.0, 20.0, 5.0, 5.0);
  104.     Misc_BuildImage (YearNumbers[4], 12.0, 20.0, 5.0, 5.0);
  105.     Misc_BuildImage (YearNumbers[5], 0.0, 14.0, 5.0, 5.0);
  106.     Misc_BuildImage (YearNumbers[6], 5.0, 14.0, 6.0, 5.0);
  107.     Misc_BuildImage (YearNumbers[7], 11.0, 14.0, 5.0, 5.0);
  108.     Misc_BuildImage (YearNumbers[8], 0.0, 8.0, 6.0, 5.0);
  109.     Misc_BuildImage (YearNumbers[9], 6.0, 8.0, 6.0, 5.0);
  110.     Misc_BuildImage (YearColon, 18.0, 25.0, 1.0, 5.0);
  111.  
  112.     Misc_BuildImage (clockbase, 64, 72, 64, 64);
  113.  
  114.     [DigitalNumbers[1] getSize:&oneSize];
  115.     [DigitalNumbers[2] getSize:&twoSize];
  116.     colonPosition.x = oneSize.width + twoSize.width + 7.0;
  117.  
  118.     timedEntry = 0;
  119.     if (keepingTime)
  120.     {
  121.         [self startClock:self];
  122.     }
  123.  
  124.     return self;
  125. }
  126.  
  127.  
  128. - initFrame:(const NXRect *)frameRect
  129. {
  130.         
  131.     [super initFrame:frameRect];
  132.     hidden=NO;
  133.     keepingTime=NO;
  134.     [self _setUp];
  135.     return self;
  136.  
  137. }
  138.  
  139. - awake
  140. {
  141.     id ret = [super awake];
  142.     [self _setUp];
  143.     return ret;
  144. }
  145.  
  146. - awakeFromNib
  147. {
  148.     id ret = [super awake];
  149.     [self _setUp];
  150.     return ret;
  151. }
  152.  
  153. - drawSelf:(const NXRect *)rects :(int)rectCount
  154. {
  155. NXPoint        imageOrigin;
  156. NXSize         size, theSize, tensSize = {0.0, 0.0}, onesSize, twoSize;
  157. id             imageAyear, imageByear, imageCyear, imageDyear;
  158. float          width, widthA, widthB, widthC;
  159. float          imageAdjust;
  160. int            currentYear, hrs;
  161.  
  162.     if (hidden) {
  163.         PSsetgray(NX_LTGRAY);
  164.         NXRectFill(&bounds);
  165.     }
  166.     
  167.     [DigitalNumbers[1] getSize:&onesSize];
  168.     [DigitalNumbers[2] getSize:&twoSize];
  169.  
  170.     if (!militaryTime)
  171.         colonPosition.x = onesSize.width + twoSize.width + 7.0;
  172.     else
  173.         colonPosition.x = 30;
  174.  
  175.     if (showYear)
  176.     {
  177.         imageAdjust = 5;
  178.         colonPosition.y = 51;
  179.     }
  180.     else
  181.     {
  182.         imageAdjust = 0;
  183.         colonPosition.y = 46;
  184.     }
  185.  
  186.  
  187.     imageOrigin.x = 0;
  188.     imageOrigin.y = 0 + imageAdjust;    //(0)
  189.     [clockbase composite:NX_COPY toPoint:&imageOrigin];
  190.  
  191.  
  192.     if (militaryTime)
  193.     {
  194.         hrs = hours;
  195.     }
  196.     else
  197.     {
  198.         hrs = hours % 12;
  199.         if (!hrs)    hrs = 12;
  200.     }
  201.     
  202.     [imageAM getSize:&size];
  203.     imageOrigin.x = 44;
  204.     imageOrigin.y = 48 + imageAdjust;    //(48)
  205.     if (!militaryTime)
  206.     {
  207.         if (meridian)
  208.         {
  209.             imageOrigin.x = 45;
  210.             [imagePM composite:NX_COPY toPoint:&imageOrigin];
  211.         }
  212.         else
  213.             [imageAM composite:NX_COPY toPoint:&imageOrigin];
  214.     }
  215.  
  216.     imageOrigin = colonPosition;
  217.     if (hrs / 10 || militaryTime)
  218.         [DigitalNumbers[hrs / 10] getSize:&tensSize];
  219.  
  220.  
  221.     [DigitalNumbers[hrs % 10] getSize:&onesSize];
  222.     imageOrigin.x -= tensSize.width + onesSize.width;
  223.  
  224.     if (hrs / 10 || militaryTime)
  225.     {
  226.         [DigitalNumbers[hrs / 10] composite:NX_COPY toPoint:&imageOrigin];
  227.         imageOrigin.x += tensSize.width;
  228.     }
  229.  
  230.     [DigitalNumbers[hrs % 10] composite:NX_COPY toPoint:&imageOrigin];
  231.     imageOrigin.x += onesSize.width;
  232.  
  233.     [[imageColon getSize:&size] composite:NX_COPY toPoint:&imageOrigin];
  234.     imageOrigin.x += size.width;
  235.  
  236.     [[DigitalNumbers[minutes / 10] getSize:&size] composite:NX_COPY toPoint:&imageOrigin];
  237.     imageOrigin.x += size.width;
  238.     [DigitalNumbers[minutes % 10] composite:NX_COPY toPoint:&imageOrigin];
  239.  
  240.     imageOrigin.x = 21;
  241.     imageOrigin.y = 34 + imageAdjust;    //(34)
  242.     [DayNames[weekday] composite:NX_COPY toPoint:&imageOrigin];
  243.  
  244.     imageOrigin.x = 19;
  245.     imageOrigin.y = 9 + imageAdjust;    //(9)
  246.     [MonthNames[month] composite:NX_COPY toPoint:&imageOrigin];
  247.  
  248.     tensSize.width = 0.0;
  249.     tensSize.height = 0.0;
  250.  
  251.  
  252.     imageOrigin.x = 30;
  253.     imageOrigin.y = 15 + imageAdjust; //(15)
  254.     if (date / 10)
  255.         [DateNumbers[date / 10] getSize:&tensSize];
  256.     [DateNumbers[date % 10] getSize:&onesSize];
  257.     imageOrigin.x -= (tensSize.width + onesSize.width) / 2;
  258.     if (date / 10)
  259.         [DateNumbers[date / 10] composite:NX_COPY toPoint:&imageOrigin];
  260.     imageOrigin.x += tensSize.width + 1;
  261.     [DateNumbers[date % 10] composite:NX_COPY toPoint:&imageOrigin];
  262.  
  263.     //Draw the year
  264.     if (showYear)
  265.     {
  266.         currentYear = [self year] + 1900;
  267.         imageAyear = YearNumbers[currentYear / 1000];
  268.         currentYear = currentYear % 1000;
  269.  
  270.         imageByear = YearNumbers[currentYear / 100];
  271.         currentYear = currentYear % 100;
  272.  
  273.         imageCyear = YearNumbers[currentYear / 10];
  274.         currentYear = currentYear % 10;
  275.  
  276.         imageDyear = YearNumbers[currentYear];
  277.  
  278.         [imageAyear getSize:&theSize];
  279.         widthA = theSize.width;
  280.         [imageByear getSize:&theSize];
  281.         widthB = theSize.width;
  282.         [imageCyear getSize:&theSize];
  283.         widthC = theSize.width;
  284.         [imageDyear getSize:&theSize];
  285.         width = widthA + widthB + widthC + theSize.width;
  286.  
  287.         imageOrigin.x = 32 - (width / 2.0);
  288.         imageOrigin.y = 0;
  289.         [imageAyear composite:NX_COPY toPoint:&imageOrigin];
  290.         imageOrigin.x = imageOrigin.x + widthA;
  291.         [imageByear composite:NX_COPY toPoint:&imageOrigin];
  292.         imageOrigin.x = imageOrigin.x + widthB;
  293.         [imageCyear composite:NX_COPY toPoint:&imageOrigin];
  294.         imageOrigin.x = imageOrigin.x + widthC;
  295.         [imageDyear composite:NX_COPY toPoint:&imageOrigin];
  296.     }
  297.     return self;
  298. }
  299.  
  300. - setSeconds:(int)theSeconds
  301. {
  302.     seconds = theSeconds;
  303.     return self;
  304. }
  305.  
  306. - setMinutes:(int)theMinutes
  307. {
  308.     minutes = theMinutes;
  309.     return self;
  310. }
  311.  
  312. - setHours:(int)theHours
  313. {
  314.     hours = theHours;
  315.     return self;
  316. }
  317.  
  318. - setWeekday:(int)theWeekday
  319. {
  320.     weekday = theWeekday;
  321.     return self;
  322. }
  323.  
  324. - setDate:(int)theDate
  325. {
  326.     date = theDate;
  327.     return self;
  328. }
  329.  
  330. - setMonth:(int)theMonth
  331. {
  332.     month = theMonth;
  333.     return self;
  334. }
  335.  
  336. - setYear:(int)theYear
  337. {
  338.     year = theYear;
  339.     return self;
  340. }
  341.  
  342. - setMeridian:(int)theMeridian
  343. {
  344.     meridian = theMeridian;
  345.     return self;
  346. }
  347.  
  348. - takeMinutesFrom:sender
  349. {
  350.     [self setMinutes:[sender intValue]];
  351.     [self display];
  352.     return self;
  353. }
  354.  
  355. - takeHoursFrom:sender    
  356. {
  357. int            localhours = [sender intValue];
  358.  
  359.     localhours %= 24;
  360.     if (localhours <= 12)
  361.     {
  362.         [self setMeridian:0];
  363.     }
  364.     else
  365.     {
  366.         [self setMeridian:1];
  367.     }
  368.     [self setHours:localhours];
  369.     [self display];
  370.     return self;
  371. }
  372.     
  373. - takeWeekdayFrom:sender
  374. {
  375.     [self setWeekday:[sender intValue]];
  376.     [self display];
  377.     return self;
  378. }
  379.  
  380. - takeDateFrom:sender
  381. {
  382.     [self setDate:[sender intValue]];
  383.     [self display];
  384.     return self;
  385. }
  386.  
  387. - takeMonthFrom:sender
  388. {
  389.     [self setMonth:[sender intValue]];
  390.     [self display];
  391.     return self;
  392. }
  393.  
  394. - setTime: (struct tm*)theTime
  395. {
  396.     seconds = theTime->tm_sec;
  397.     minutes = theTime->tm_min;
  398.     hours = theTime->tm_hour;
  399.     if (hours <= 12)
  400.     {
  401.         meridian = 0;
  402.     }
  403.     else
  404.     {
  405.         meridian = 1;
  406.     };
  407.     date = theTime->tm_mday;
  408.     month = theTime->tm_mon;
  409.     year = theTime->tm_year;
  410.     weekday = theTime->tm_wday;
  411.     return self;
  412. };
  413.  
  414.  
  415.  
  416. - (const char *)getInspectorClassName
  417. {
  418.     return "MiscClockViewInspector";
  419. }
  420.  
  421. - (int)year
  422. {
  423.     return year;
  424. }
  425.  
  426. - (int)month
  427. {
  428.     return month;
  429. }
  430.  
  431. - (int)weekday
  432. {
  433.     return weekday;
  434. }
  435.  
  436. - (int)date
  437. {
  438.     return date;
  439. }
  440.  
  441. - (int)hours
  442. {
  443.     return hours;
  444. }
  445.  
  446. - (int)minutes
  447. {
  448.     return minutes;
  449. }
  450.  
  451. - (int)seconds
  452. {
  453.     return seconds;
  454. }
  455.  
  456.  
  457. - (BOOL)militaryTime
  458. {
  459.     return militaryTime;
  460. }
  461.  
  462. - (BOOL)showYear
  463. {
  464.     return showYear;
  465. }
  466.  
  467. - setShowYear:(BOOL)state
  468. {
  469.     showYear = state;
  470.     return self;
  471. }
  472.  
  473.  
  474. - setMilitaryTime:(BOOL)state
  475. {
  476.     militaryTime = state;
  477.     return self;
  478. }
  479.  
  480.  
  481. - (BOOL)keepingTime
  482. {
  483.     return keepingTime;
  484. }
  485.  
  486.  
  487. - setKeepingTime:(BOOL)yesno
  488. {
  489.     keepingTime = yesno;
  490.     return self;
  491. }
  492.  
  493. - read:(NXTypedStream *) stream
  494. {
  495.     int myVersion = NXTypedStreamClassVersion (stream,[self name]);
  496.  
  497.     [super read:stream];
  498.     if (myVersion < 2)
  499.     {
  500.         NXReadTypes (stream, "iiiiiiiiii", &seconds, &minutes, &hours,
  501.         &date, &month, &year, &weekday, &meridian, &showYear, &militaryTime);
  502.     }
  503.     else
  504.     {
  505.         NXReadTypes (stream, "iiiiiiiicc", &seconds, &minutes, &hours,
  506.         &date, &month, &year, &weekday, &meridian, &showYear, &militaryTime);
  507.     }
  508.     if (myVersion < 1)
  509.     {
  510.         keepingTime = NO;
  511.     }
  512.     else if (myVersion == 1)
  513.     {
  514.         NXReadType (stream, "i", &keepingTime);
  515.     }
  516.     else
  517.     {
  518.         NXReadType (stream, "c", &keepingTime);
  519.     }
  520.     if (myVersion > 2) {
  521.         NXReadType (stream, "c", &hidden);
  522.     } else {
  523.         hidden = NO;
  524.     }
  525.     return self;
  526. }
  527.  
  528. - write:(NXTypedStream *) stream
  529. {
  530.     [super write:stream];
  531.     NXWriteTypes (stream, "iiiiiiiicc", &seconds, &minutes, &hours,
  532.     &date, &month, &year, &weekday, &meridian, &showYear, &militaryTime);
  533.     NXWriteType (stream, "c", &keepingTime);
  534.     NXWriteType (stream, "c", &hidden);
  535.     return self;
  536. }
  537.  
  538. - setHide:(BOOL)hide
  539. {
  540.    hidden = hide;
  541.  
  542.    return self;
  543. }
  544.  
  545. - (BOOL)isHidden
  546. {
  547.    return hidden;
  548. }
  549.  
  550.  
  551. void 
  552. Animate (timedEntry, now, self)
  553.     DPSTimedEntry  timedEntry;
  554.     double         now;
  555.     id             self;
  556. {
  557.     [(id)self ticktock];
  558. }
  559.  
  560. - ticktock
  561. {
  562. struct timeval tp;
  563. struct timezone tzp;
  564. struct tm     *tv;
  565.  
  566.     gettimeofday (&tp, &tzp);
  567.     tv = localtime (&tp.tv_sec);
  568.     [self setTime:tv];
  569.     [self display];
  570.     return self;
  571. }
  572.  
  573. - startClock:sender
  574. {
  575.     if (!keepingTime)
  576.     {
  577.         [self ticktock];
  578.         timedEntry = DPSAddTimedEntry (60, Animate, (void *)self, NX_MODALRESPTHRESHOLD);
  579.         keepingTime = YES;
  580.         NXPing ();
  581.     }
  582.     return self;
  583. }
  584.  
  585. - stopClock:sender
  586. {
  587.     if (timedEntry)
  588.     {
  589.         DPSRemoveTimedEntry (timedEntry);
  590.         [self ticktock];
  591.         keepingTime = NO;
  592.         timedEntry = 0;
  593.     }
  594.  
  595.     return self;
  596. }
  597.  
  598. - free
  599. {
  600.    int i;
  601.     
  602.     [imageA free];
  603.     [imageP free];
  604.     for(i=0;i<10;i++)
  605.         [DigitalNumbers[i] free];
  606.     [imageColon free];
  607.     [imageAM free];
  608.     [imagePM free];
  609.     
  610.     for(i=0;i<7;i++)
  611.         [DayNames[i] free];
  612.     for(i=0;i<12;i++)
  613.        [MonthNames[i] free];
  614.     for(i=0;i<10;i++)
  615.         [DateNumbers[i] free];
  616.     for(i=0;i<10;i++)
  617.         [YearNumbers[i] free];
  618.     [YearColon free];
  619.     [clockbase free];
  620.     [theImage free];
  621.  
  622.     if (timedEntry != NULL)
  623.         DPSRemoveTimedEntry (timedEntry);
  624.     return[super free];
  625. }
  626.  
  627. - setToCurrentTime:sender
  628. {
  629. struct timeval        tp;
  630. struct timezone    tzp;
  631. struct tm             *tv;
  632.  
  633.     gettimeofday (&tp, &tzp);
  634.     tv = localtime (&tp.tv_sec);
  635.     [self setTime:tv];
  636.     [self display];
  637.     
  638.     return self;
  639. }
  640.  
  641. @end
  642.